home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / 0Utils13.lha / 0Utils / VolName.c < prev    next >
C/C++ Source or Header  |  1995-03-20  |  5KB  |  235 lines

  1.  
  2. /******************************************************************************
  3.  
  4.     MODULE
  5.     VolName.c
  6.  
  7.     DESCRIPTION
  8.     Get one filename on Commandline
  9.     and write to StdOut its Volumename
  10.  
  11.     NOTES
  12.     Kickstart 2.0+ required
  13.     compiles w/ SAS/C v6.51
  14.  
  15.     BUGS
  16.     We may use 'Lock', so VolName fails, if the
  17.     file does't exist or is exclusively locked
  18.  
  19.     TODO
  20.  
  21.     EXAMPLES
  22.  
  23.     SEE ALSO
  24.  
  25.     INDEX
  26.  
  27.     HISTORY
  28.     08-02-95 b_noll created
  29.     11-02-95 b_noll enabled 'DEVICE/S', changed 'PHYSICAL' to 'VOLUME'
  30.     20-02-95 b_noll restructured source
  31.     21-02-95 b_noll added version/format-prefix/offset
  32.     20-03-95 b_noll added args diagnostics
  33.  
  34.     AUTHOR
  35.     Bernd Noll, Brunnenstrasse 55, D-67661 Kaiserslautern
  36.     b_noll@informatik.uni-kl.de
  37.  
  38. ******************************************************************************/
  39.  
  40. /**************************************
  41.         Includes
  42. **************************************/
  43.  
  44. #ifndef   EXEC_LIBRARIES_H
  45. # include <exec/libraries.h>
  46. #endif /* EXEC_LIBRARIES_H */
  47.  
  48. #ifndef   CLIB_EXEC_PROTOS_H
  49. # include <clib/exec_protos.h>
  50. #endif /* CLIB_EXEC_PROTOS_H */
  51.  
  52. #ifndef   DOS_DOS_H
  53. # include <dos/dos.h>
  54. #endif /* DOS_DOS_H */
  55.  
  56. #ifndef   CLIB_DOS_PROTOS_H
  57. # include <clib/dos_protos.h>
  58. #endif /* CLIB_DOS_PROTOS_H */
  59.  
  60. #include <proto/dos.h>
  61. #include <proto/exec.h>
  62.  
  63. /**************************************
  64.      Defines & Structures
  65. **************************************/
  66.  
  67. #ifndef ABSEXECBASE
  68. #define ABSEXECBASE ((struct ExecBase **)4L)
  69. #endif
  70.  
  71. struct _arg {
  72. /* ******************** USER FORMAT ******************** */
  73. #define FORMAT "FILE/A,VOLUME/S,DEVICE/S"
  74.  
  75.     STRPTR file;
  76.     ULONG  volume;
  77.     ULONG  device;
  78.  
  79. /* ******************** USER FORMAT ******************** */
  80. }; /* struct _argv */
  81.  
  82. #define MAXPATHLEN 256
  83. #define MAXLINELEN 256
  84.  
  85. #define VERSIONPREFIX    "\0$VER: "
  86. #define VERSIONOFFSET    0
  87. #define FORMATPREFIX    "\0$ARG: "
  88. #define FORMATOFFSET    7
  89.  
  90. /**************************************
  91.         Implementation
  92. **************************************/
  93.  
  94. #if defined(_DCC)
  95.  
  96. /* DICE has no '__inline' directive; we must set the support
  97.    function behind the main function, cause the program is
  98.    started w/ the 1st opcode */
  99.  
  100. long __main(void) { static long _main(void); return _main(); }
  101.  
  102. #endif
  103.  
  104. /* only SAS/C and GNU/C have an '__inline' directive */
  105. /* ******************** USER ADDES ******************** */
  106.  
  107. /*static __inline void DLName2CSTR(BPTR bstr, STRPTR buf, WORD bsize) {
  108.     STRPTR x,y;
  109.     int z;
  110.     x = (STRPTR)BADDR(bstr);
  111.     y = buf;
  112.     z = *(x++);
  113.     if (z >= bsize) z = bsize - 1;
  114.     while (z--) *(y++) = *(x++);
  115.     *(y++) = ':';
  116.     *y       = 0;
  117. } /* DLName2CSTR */
  118.  
  119. /* ******************** USER ADDES ******************** */
  120.  
  121. long _main (void)
  122. {
  123.     const char* version = VERSIONPREFIX "VolName 1.3 " __AMIGADATE__ + VERSIONOFFSET;
  124.     long retval = RETURN_FAIL;
  125.     struct ExecBase*SysBase = *ABSEXECBASE;
  126.     struct Library* DOSBase;
  127.  
  128.     if (DOSBase = OpenLibrary (DOSNAME, 37)) {
  129.     struct _arg argv = { 0 };
  130.     APTR   args;
  131.     retval     = RETURN_ERROR;
  132.     if (args = (void*)ReadArgs(FORMATPREFIX FORMAT + FORMATOFFSET, (LONG*)&argv, NULL)) {
  133. /* ******************** USER BODY ******************** */
  134.  
  135.         APTR        processwin;
  136.         struct Process *process;
  137.         STRPTR        filename = argv.file;
  138.         //UBYTE        buffer[MAXPATHLEN];
  139.         BPTR        out;
  140.  
  141.         out = Output();
  142.  
  143.         if ((process = (struct Process *)FindTask(NULL))) {
  144.         processwin = process->pr_WindowPtr;
  145.         process->pr_WindowPtr = (APTR)-1;
  146.         } /* if */
  147.  
  148.         if (argv.device || argv.volume || !*filename) {
  149.  
  150.         BPTR lock;
  151. //dolock:
  152.  
  153.         if (lock = Lock(filename, SHARED_LOCK)) {
  154.             struct FileLock *fl;
  155.             struct DosList  *dl;
  156.  
  157.             fl = BADDR(lock);
  158.             dl = BADDR(fl->fl_Volume);
  159.  
  160.             if (argv.device) {
  161.             struct MsgPort    *mp;
  162.  
  163.             mp = dl->dol_Task;
  164.  
  165.             dl = LockDosList(LDF_DEVICES|LDF_READ);
  166.             while (dl = NextDosEntry(dl,LDF_DEVICES)) {
  167.                 if (dl->dol_Task == mp) {
  168.                 FPrintf(out, "%b:\n", dl->dol_Name);
  169.                 out = 0;
  170.                 break;
  171.                 } /* if Found */
  172.             } /* while Searching */
  173.             UnLockDosList(LDF_DEVICES|LDF_READ);
  174.             } else {
  175.             FPrintf(out, "%b:\n", dl->dol_Name);
  176.             out = 0;
  177.             } /* if (!)Device */
  178.  
  179.             UnLock (lock);
  180.         } /* if Lock */
  181.         } /* if DoLocking */
  182.  
  183.  
  184.  
  185.         /* ---- Extract the Volumepart */
  186.         if (out) {
  187. #ifdef ALPHA
  188.         UBYTE buffer[MAXPATHLEN];
  189.         if (SplitName(filename, ':', buffer, 0, MAXPATHLEN) != -1) {
  190.             FPrintf(out, "%s:\n", buffer);
  191.             out = 0;
  192. //          } else if (*filename) {
  193. //              filename = "";
  194. //              goto dolock;
  195.         } /* if */
  196. #else
  197.         UBYTE        c, *p;
  198.         for (p = filename; (c = *p) && c != ':'; ++p);
  199.         if (c) {
  200.             *p = 0;
  201.             FPrintf(out, "%s:\n", filename);
  202.             out = 0;
  203.             *p = ':';
  204. //          } else if (*filename) {
  205. //              filename = "";
  206. //              goto dolock;
  207.         } /* if */
  208. #endif
  209.         } /* if */
  210.         //PutStr (":\n");
  211.         retval = out ? RETURN_WARN : RETURN_OK;
  212.  
  213.  
  214.         if (process != NULL) {
  215.         process->pr_WindowPtr = processwin;
  216.         } /* if */
  217.  
  218. /* ******************** USER BODY ******************** */
  219.         FreeArgs (args);
  220.     } /* if */
  221.  
  222.     if (retval > RETURN_WARN)
  223.         PrintFault(IoErr(), "VolName");
  224.  
  225.     CloseLibrary (DOSBase);
  226.     } /* if */
  227.     return (retval);
  228. } /* _main */
  229.  
  230.  
  231. /******************************************************************************
  232. *****  END VolName.c
  233. ******************************************************************************/
  234.  
  235.